#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>
#include<cstdlib>
#include<thread>

using namespace std;

// void* threadRun(void* args)
// {
//     while(1)
//     {
//         std::cout << "new thread: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, nullptr);
//     while(1)
//     {
//         std::cout << "main thread: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// std::string toHex(pthread_t tid)
// {
//     char hex[64];
//     snprintf(hex, sizeof(hex), "%p", tid);
//     return hex;
// }
// void* threadRoutine(void* args)
// {
//     while(true)
//     {
//         cout << "thread id: " << toHex(pthread_self()) << endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");
//     cout << "main thread create thread done, new thread id: " << toHex(tid) << endl;
//     pthread_join(tid, nullptr);
//     return 0;
// }

// std::string toHex(pthread_t tid)
// {
//     char hex[64];
//     snprintf(hex, sizeof(hex), "%p", tid);
//     return hex;
// }

// void *threadRoutine(void *args)
// {
//     while(true)
//     {
//         cout << "thread id: " << toHex(pthread_self()) << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");

//     cout << "main thread create thead done, new thread id : " << toHex(tid) << endl;
//     pthread_join(tid, nullptr);

//     return 0;
// }

//C++11原生线程库

// void threadrun()
// {
//     while(true)
//     {
//         cout << "I am a new thread for C++" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t1(threadrun);
//     t1.join();
//     return 0;
// }

// class Request
// {
// public:
//     Request(int start, int end, const string& threadname)
//         :start_(start)
//         ,end_(end)
//         ,threadname_(threadname)
//     {}
// public:
//     int start_;
//     int end_;
//     string threadname_;
// };

// class Response
// {
// public:
//     Response(int result, int exitcode)
//         :result_(result)
//         ,exitcode_(exitcode)
//     {}
// public:
//     int result_;
//     int exitcode_;
// };

// void* sumCount(void* args)
// {
//     Request* rq = static_cast<Request*>(args);
//     Response* rsp = new Response(0, 0);
//     for(int i = rq->start_; i <= rq->end_; i++)
//     {
//         cout << rq->threadname_ << " is runing, calling..., " << i << endl;
//         rsp->result_ += i;
//         usleep(100000);
//     }
//     delete rq;
//     return rsp;
// }
// int main()
// {
//     pthread_t tid;
//     Request* rq = new Request(1, 100, "thread 1");
//     pthread_create(&tid, nullptr, sumCount, rq);
//     void* ret;
//     pthread_join(tid, &ret);
//     Response* rsp = static_cast<Response*>(ret);
//     cout << "rsp->result: " << rsp->result_ << ", exitcode: " <<rsp->exitcode_ <<endl;
//     delete rsp;

//     return 0;
// }

// int g_val = 100;

// void show(const string& name)
// {
//     cout << name << "say# " << "hello thread" << endl;
// }

// void* threadRoutine(void* args)
// {
//     const char* name = (const char*)args;
//     int cnt = 5;
//     while(true)
//     {
//         printf("%s, pid: %d, g_val: %d, &g_val: 0x%p\n", name, getpid(), g_val, &g_val);
//         sleep(1);
//         cnt--;
//         if(cnt == 0)
//         {
//             break;
//         }
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");
//     sleep(1);
//     pthread_cancel(tid);
//     sleep(1);
//     return 0;
//     // while (true)
//     // {
//     //     printf("main thread pid: %d, g_val: %d, &g_val: 0x%p, create new thread tid: %p\n", getpid(), g_val, &g_val, tid);
//     //     // cout << "main thread, pid: " << getpid() << ", g_val: " << g_val << ", &g_val:" << &g_val << endl;
//     //     // show("[main thread]");
//     //     sleep(1);
//     //     g_val++;
//     // }
//     // sleep(7);
//     void *retval;
//     pthread_join(tid, &retval);    // main thread等待的时候，默认是阻塞等待的！为什么我们在这里join的时候不考虑异常呢？？做不到！
//     cout << "main thread quit ..., ret: " << (long long int)retval << endl;    

//     return 0;
// }